package com.huazai.study;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class 通过反射创建对象 {
    public static void main(String[] args) {
        try {
            Class<?> c1 = Class.forName("com.huazai.study.User");

            //构造一个对象，本质上会调用无参构造器
            User lyt = (User) c1.getDeclaredConstructor().newInstance();
            System.out.println(lyt);

            //通过构造器创建对象
            Constructor<?> constructor = c1.getDeclaredConstructor(int.class, String.class);
            User zzh = (User) constructor.newInstance(18, "zzh");
            System.out.println(zzh);

            //通过反射来调用方法，使用invoke（）来使用反射获取的方法
            //假如说有一个需求是用字符串来调用对应的方法，就可以用反射来对应方法
            User zzj = (User) c1.getDeclaredConstructor().newInstance();
            Method test2 = c1.getDeclaredMethod("test2", String.class);
            test2.invoke(zzj,"渣渣辉");

            System.out.println("========================================================");
            //通过反射来操作属性
            User user4 = (User) c1.getDeclaredConstructor().newInstance();
            Field name = c1.getDeclaredField("name");

            name.setAccessible(true);
            //不能直接操作私有属性，但是可以通过serAccessible()该方法可以让java去访问private权限的变量
            name.set(user4,"另一个zzh");
            System.out.println(user4.getName());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
